1. Field of the Invention
The invention relates to software reliability. More particularly, the invention relates to an iterative methodology for detecting and correcting errors in computer software.
2. Discussion of the Related Art
In recent years, the size and complexity of software applications have increased significantly. Part of this increased size may be attributed to significant improvements in hardware, including increased in microprocessor speed and a reduction in the cost of volatile and non-volatile computer memory devices. Software developers have not focused on writing highly optimized, efficient code because inefficiencies in the software are often masked by the speed of the hardware.
Many different types of errors have been identified in software applications at the operating system level. For example, persistent storage problems compromise the integrity of the persistent store or impede it from performing its intended service. Persistent storage problems include faults that occur when a file system becomes full and thus unable to store data, leading to the blocking of file system clients awaiting storage resources, corruption of file system data structures, and corruption of files.
Memory problems are also common errors that compromise the integrity of transient memory. Driver/Driver isolation errors occur when a fault device is not effectively isolated by its device driver. The ineffective containment of the fault leads to fault propagation and usually the need for more drastic recovery action.
Incompatibility problems between older and newer versions of software are also common. This can lead to an inability to complete a task and can be particularly problematic as upgrades put the system in a state of inherent vulnerability. One example of this is a problem that may arise when an existing version of RAM code cannot properly load a new ROM code.
Inversion problems arise when a system cannot provide, in a timely manner, its intended function. For example, a priority inversion may occur when a high priority service is blocked while awaiting completion of a low priority service. A resource inversion may occur wherein a high priority service is blocked awaiting a resource held by a lower priority service.
Deadlock problems arise when a service awaits a condition that will never occur. Deadlocks may occur when a currently executing service awaits release of a resource held by another lower priority service not in execution. Deadlocks may also occur when a failure occurs or when a resource is depleted.
In view of the problems described above, the need for improved reliability in software applications has become more important, particularly for so called “mission critical” applications. Various techniques have been developed to improve software reliability. Some software developers have designed more efficient software by optimizing or “tuning” their code for a particular operational environment or mode by placing highly used routines closer together and optimizing the execution speed along heavily-traveled paths. The primary objective of such optimization is to reduce the time it takes a computer program to perform a particular task.
Hand tuning of software applications requires manual code correction by a programmer. As software applications have grown in size complexity, hand tuning has become increasingly tedious and time-consuming. Thus, hand tuning is often reserved for the most highly utilized program sections.
Automated tools such as optimizing compilers have been utilized to enhance the run-time performance of a piece of software. Automated profilers are employed to provide data to the optimizing compilers. In general, these profilers monitor the execution of a particular piece of software and gather information on the most likely paths of execution. The optimizing compiler then used the information gathered by the profiler to recompile the source code in a more efficient manner.
The automated optimization processes are generally limited to a usage pattern of a single fixed user group or single operational mode. Thus, these processes are limited, causing a degradation to the run-time performance of a program while executing in non-optimized operational environments or modes.